package com.zhq.dao;

import com.zhq.bean.Express;
import com.zhq.exception.DuplicateCodeException;

import java.util.List;
import java.util.Map;

/**
 * @Author:钟豪强
 * @Description:    和快递有关的操作
 * @Date Created in  2020-08-14 22:17
 * @Modified By:
 */
public interface BaseExpressDao {
    /**
     * 用于查询数据库中全部快递信息(总数和新增),代取件快递(总数加新增)
     * @return  [{size:总数,day:新增},{size:代取件总数,day:新增代取件}]
     */
    List<Map<String,Integer>> console();

    /**
     * 查询所有快递
     * @param limit 表示是否分页,true是分页,false是不分页
     * @param offset    SQL语句的分页起始索引
     * @param pageNumber    页查询的数量
     * @return  返回快递的集合,没有快递信息返回null
     */
    List<Express> findAll(boolean limit, int offset, int pageNumber);

    /**
     * 根据快递单号查询快递信息
     * @param number    快递信息
     * @return  返回该单号快递,单号不存在返回null
     */
    Express findByNumber(String number);

    /**
     * 根据id查询快递信息
     * @param id    快递id
     * @return  返回该id快递,单号不存在返回null
     */
    Express findById(int id);

    /**
     * 根据快递取件码查询快递信息
     * @param code  取件码
     * @return  返回该取件码快递,取件码不存在返回null
     */
    Express findByCode(String code);

    /**
     * 根据用户手机号,查询他的所有快递信息
     * @param userPhone   手机号
     * @return  快递信息的集合
     */
    List<Express> findByUserPhone(String userPhone);

    /**
     * 用于根据取件人手机号码和快递状态,查询所有符合状态的快递信息
     * @param userPhone   手机号
     * @param status   快递状态
     * @return  快递信息的集合
     */
    List<Express> findByUserPhoneAndStatus(String userPhone, int status);

    /**
     * 根据录入人手机号码,查询录入的所有记录
     * @param sysPhone   录入人手机号
     * @return  快递信息的集合
     */
    List<Express> findBySysPhone(String sysPhone);

    /**
     * 快递的录入
     * @param express   录入的快递对象
     * @return  录入的结果,true表示成功,false表示失败
     * @throws DuplicateCodeException
     */
    boolean insert(Express express) throws DuplicateCodeException;

    /**
     * (根据id)快递的修改
     * @param id    要修改的快递id
     * @param newExpress    新的的快递对象(number,company,username,userPhone,status)
     * @return  修改的结果,true代表修改成功,false代表修改失败
     */
    boolean update(int id, Express newExpress);

    /**
     * 根据快递id,修改取件码
     * @param id    快递id
     * @param newCode   新区取件码
     * @return  true代表修改成功
     * @throws DuplicateCodeException
     */
    boolean updateCode(int id, String newCode) throws DuplicateCodeException;

    /**
     * 更改快递的状态为1,表示取件的完成
     * @param code    要修改的快递取件码
     * @return  修改的结果,true表示成功,false表示失败
     */
    boolean updateStatus(String code);

    /**
     * 根据快递id,修改sysPhone
     * @param sysPhone  录入人手机号码
     * @return  true代表修改成功
     */
    boolean updateSysPhone(int id, String sysPhone);

    /**
     *  根据快递id  修改收件人手机号码
     * @param id    快递id
     * @param userPhone 收件人手机号码
     * @return  true代表修改成功
     */
    boolean updateUserPhone(int id, String userPhone);

    /**
     * 根据id,删除单个快递信息
     * @param id    要删除的快递信息
     * @return  删除的结果,true表示成功,false表示失败
     */
    boolean delete(int id);
}
